home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / shell / igo / gosource / print.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  11.6 KB  |  487 lines

  1. #define DEBUG 0
  2. /* 
  3.     TOWNS囲碁棋譜記録プログラム
  4.                                           1991/12/11  久保田俊也
  5.  
  6.     93/05/24  印刷 モジュールを本体より分離 
  7.  
  8.  
  9. */
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <egb.h>
  14. #include <conio.h>
  15. #include <msdos.cf>
  16. #include <BPRDEV.H>
  17. #include "igo.h"
  18. #include "banx.h"
  19. #include "kiffile.h"
  20. #include "title.h"
  21.  
  22. #define WHITE_PRINT_COL 0
  23. #define BLACK_PRINT_COL 1
  24. #define WAKUX1 0
  25. #define WAKUY1 0
  26. #define ISHI_R 16
  27.  
  28. extern char *gwork;    /* グラフイックBIOSワーク */
  29. extern     char para[64] ;
  30.  
  31. static    BPR_Info    info;
  32. static    BPR_Buff    buff;
  33. static    BPR_Work    work;
  34. static    char        work1[BPR_BUFFSIZE];
  35.  
  36. static int banx1, bany1, banx2, bany2, ishi_r, ishi_2r;
  37. static int ban_length = 640, tate_bangai = 200;
  38. static int left_mergin = 0;
  39. static int type, bansize;
  40. static char *ram;
  41.  
  42. void *my_malloc(size_t size);
  43.  
  44. int print_start()
  45. {
  46. int         rc;
  47.  
  48.     ram = my_malloc( 640*840/8 );
  49.     EGB_resolutionRam( gwork, 0x80, 1, 640, 840, ram) ; /* 仮想画面の設定 */
  50.     EGB_writePage( gwork, 0x80) ;    /* 仮想画面に書き込み */
  51.  
  52.     info.BitType = BPR_MONO;
  53.     info.Density = 90;     /* 印刷画像の大きさの設定 */
  54.     info.Width   = ban_length + left_mergin;
  55.     info.Height  = ban_length + tate_bangai;
  56.     info.Palette = NULL;
  57.     info.ColorType = BPR_MONO;
  58.     info.Reverse = BPR_NORMAL;
  59.     info.TopSpace = 0;
  60.     info.LeftSpace = 0;
  61.     info.rsv[0] = info.rsv[1] = info.rsv[2] = info.rsv[3] = 0;
  62.     
  63.     buff.BuffSize = BPR_BUFFSIZE;
  64.     buff.BuffAddr = work1;
  65.     
  66.     rc = BPR_Select( 0,&info,&buff );
  67.     if( rc < 0 )
  68.         {
  69.         printf("--BPR_Select ERROR!!  %x--\n",BPRDEVERR);
  70.         my_free(ram);
  71.         EGB_writePage( gwork, 0) ;    /* ページ 0     に */
  72.         return    -1;
  73.     }
  74.  
  75.     rc = BPR_GetSize( &work );
  76.     if( rc < 0 )
  77.         {
  78.         printf("--BPR_GetSize  ERROR!! %x--\n",BPRDEVERR);
  79.         my_free(ram);
  80.         EGB_writePage( gwork, 0) ;    /* ページ 0     に */
  81.         return    -1;
  82.     }
  83.  
  84.     if( work.Work1.BuffSize != 0 )
  85.         work.Work1.BuffAddr = my_malloc( work.Work1.BuffSize );
  86.     work.Work2.BuffAddr = my_malloc( work.Work2.BuffSize );
  87.     work.Work3.BuffAddr = my_malloc( work.Work3.BuffSize );
  88.     work.Work4.BuffAddr = my_malloc( work.Work4.BuffSize );
  89.     work.Work5.BuffAddr = my_malloc( work.Work5.BuffSize );
  90.     
  91.     rc = BPR_Start( 0, 40, &work );
  92.     if( rc < 0 )
  93.         {
  94.         printf("--BPR_Start ERROR!! %x--\n",BPRDEVERR);
  95.         my_free(ram);
  96.         if( work.Work1.BuffSize != 0 )
  97.             my_free(work.Work1.BuffAddr);
  98.         my_free(work.Work2.BuffAddr);
  99.         my_free(work.Work3.BuffAddr);
  100.         my_free(work.Work4.BuffAddr);
  101.         my_free(work.Work5.BuffAddr);
  102.     
  103.         EGB_writePage( gwork, 0) ;    /* ページ 0     に */
  104.         return    -1;
  105.     }
  106.     
  107.     EGB_writePage( gwork, 0) ;    /* ページ 0     に */
  108.     return 0;
  109. }
  110.  
  111. int print_bangai( char *wstr, int start_te, int end_te)
  112. {
  113.  
  114.     EGB_writePage( gwork, 0x80 ) ;    /* 仮想画面に設定 */
  115.     
  116.     print_do_bangai();
  117.     print_do_title( start_te, end_te);
  118.     print_do_kakusite( wstr);
  119.  
  120.     EGB_writePage( gwork, 0 ) ;    /* ページ 0 に */
  121.  
  122.     return 0;
  123. }
  124.  
  125. static int print_do_bangai()
  126. {
  127.  
  128.     EGB_color( gwork, 0, 1 /* BLACK_COL */) ;    
  129.     EGB_color( gwork, 2, 0 /* WHITE_COL */) ;    
  130.     EGB_paintMode( gwork, 0x022 ); 
  131.     EGB_box( gwork, WAKUX1+left_mergin, 
  132.         WAKUY1, WAKUX1+left_mergin+ban_length-1, 
  133.         WAKUY1+tate_bangai);     /* [46] 四角を描く */
  134.  
  135.     return 0;
  136. }
  137.  
  138. static int print_do_title( int start_te, int end_te)
  139. {
  140. char disp_line[80];
  141. char blackname[21], whitename[21];
  142. char wstr[33], wstr2[33];
  143. char play_space[21];
  144. int    komi_id, komi_number, hanmoku_id;
  145. int    vicdef_id, vicdef_number;
  146. char start_time[80], end_time[80];
  147.  
  148. static char komi_str[3][11] = {
  149.     {"黒コミ出し"},
  150.     {"白コミ出し"},
  151.     {"コミなし  "},
  152.     };
  153.  
  154. static char vicdef_str[4][5] = {
  155.     {"黒  "},
  156.     {"白  "},
  157.     {"ジゴ"},
  158.     {"    "},
  159.     };
  160.  
  161.     /* 1行目 */
  162.     Debugprint("igo:print_do_title first line!\n");
  163.     hyouji_start_end_time( start_time, end_time);
  164.     sprintf(disp_line, "対局日時  %s  ー  %s", start_time, end_time);
  165.     print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 1*16);
  166.  
  167.     /* 2行目 */
  168.     Debugprint("igo:print_do_title second line!\n");
  169.     title_blacknameread( blackname); 
  170.     title_whitenameread( whitename);
  171.     sprintf(disp_line, "対局者    黒  %s  ー  白  %s", blackname, whitename);
  172.     print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 2*16);
  173.  
  174.     /* 3行目 */
  175.     Debugprint("igo:print_do_title third line!\n");
  176.     title_playspaceread( play_space);
  177.     sprintf(disp_line, "対局場所  %s", play_space);
  178.     print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 3*16);
  179.     
  180.     /* 4行目 */
  181.     Debugprint("igo:print_do_title fourth line!\n");
  182.     if(title_handy_int_read() == 1){
  183.         strcpy(wstr, "互先");
  184.     }else{
  185.         sprintf(wstr, "%s子局", title_handy_wazenkaku_read());
  186.     }
  187.     title_komiread( &komi_id, &komi_number, &hanmoku_id);
  188.     sprintf(wstr2, "");
  189.     if(komi_id!=2 && komi_number > 0){
  190.         switch(hanmoku_id ){
  191.             case 0: 
  192.                 sprintf(wstr2, "%d目半", komi_number);
  193.                 break;
  194.             case 1: 
  195.             default:
  196.                 sprintf(wstr2, "%d目  ", komi_number);
  197.                 break;
  198.         }
  199.     }
  200.     sprintf(disp_line, "手合い    %s  %s%s",
  201.                 wstr, komi_str[komi_id], wstr2);
  202.     print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 4*16);
  203.  
  204.     /* 5行目 */
  205.     Debugprint("igo:print_do_title five line!\n");
  206.     title_issueread( &vicdef_id, &vicdef_number);
  207.     switch(vicdef_id ){
  208.         case 0: 
  209.         case 1: 
  210.             if(vicdef_number==-1){
  211.                 strcpy(wstr, "中押し勝ち");
  212.             }else if(vicdef_number==0){
  213.                 if(hanmoku_id == 0 && (komi_id == 0 || komi_id == 1)){
  214.                     strcpy(wstr, "半目勝ち");
  215.                 }else{
  216.                     strcpy(wstr, "中押し勝ち");
  217.                 }
  218.             }else{
  219.                 if(hanmoku_id == 0 && (komi_id == 0 || komi_id == 1)){
  220.                     sprintf(wstr, "%d目%s", vicdef_number, "半勝ち");
  221.                 }else if(vicdef_id != 2){
  222.                     sprintf(wstr, "%d目%s", vicdef_number, "勝ち");
  223.                 }
  224.             }
  225.             break;
  226.         default: break;
  227.     }
  228.     sprintf(disp_line, "結果      %s%s", vicdef_str[vicdef_id], wstr);
  229.     print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 5*16);
  230.     
  231.     /* 6行目 */
  232.     Debugprint("igo:print_do_title sixth line!\n");
  233.     sprintf(disp_line, "%d手から%d手まで表示", start_te, end_te);
  234.     print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 6*16);
  235.     
  236.     return 0;
  237. }
  238.  
  239. static int print_do_kakusite( char *wstr)
  240. {
  241. char disp_line[80]; /* 80 は1行分の長さ */
  242. int i,j,k;
  243. int max_line;
  244.  
  245.     max_line = ((tate_bangai - 5)/16)-6;
  246.     k=0;
  247.     j=0;
  248.     for(i=0;wstr[i]!='\0';i++){
  249.         /* 行数のオーバーのチェック */
  250.         if(k==max_line-1){
  251.             strcpy( disp_line, "以下略");
  252.             print_gprint( disp_line, WAKUX1+left_mergin+5, WAKUY1+5 + (7+k)*16);
  253.             break;
  254.         }
  255.         
  256.         disp_line[j] = wstr[i];
  257.         j++;
  258.         if((wstr[i] == ')' && j>60 ) || j>79 ){
  259.             disp_line[j] = '\0';
  260.         /* 7行目 から印刷 */
  261.             print_gprint( disp_line, WAKUX1+left_mergin+5, WAKUY1+5 + (7+k)*16);
  262.             k++;
  263.             j=0;
  264.             disp_line[0] = '\0';
  265.             i++;
  266.             for(;wstr[i]==' ';i++){
  267.                 ;
  268.             }
  269.             i--;
  270.         }
  271.     }
  272.  
  273.     disp_line[j] = '\0';
  274.     print_gprint( disp_line, WAKUX1+left_mergin+5, WAKUY1+5 + (7+k)*16);
  275.  
  276.     return 0;
  277. }
  278.  
  279. int print_te( char ban[],int ex_ban[])
  280. {
  281. BAN_TYPE ban_type;
  282.  
  283.     ban_type = *title_bantype_read();
  284.     if( ban_type.type == NORMAL){
  285.         type = NORMAL;
  286.         bansize = ban_type.size;
  287.     }
  288.  
  289.     EGB_writePage( gwork, 0x80 ) ;    /* 仮想画面に設定 */
  290.  
  291.     EGB_color( gwork, 0, 1 /* BLACK_COL */ ) ;    
  292.     EGB_color( gwork, 2, 0 /* WHITE_COL */ ) ;    
  293.     EGB_paintMode( gwork, 0x022 ); 
  294.     EGB_box( gwork, WAKUX1+left_mergin, 
  295.         WAKUY1+tate_bangai, WAKUX1+left_mergin+ban_length-1, 
  296.         WAKUY1+tate_bangai+ban_length-1);     /* [46] 四角を描く */
  297.  
  298.     print_goban( WAKUX1+left_mergin, WAKUY1+tate_bangai, ISHI_R);
  299.     print_do_te( ban, ex_ban);
  300.  
  301.     EGB_writePage( gwork, 0 ) ;    /* ページ 0 に */
  302.  
  303.     return 0;
  304. }
  305.  
  306. static int print_goban(int x, int y, int z)
  307. {
  308. int i, j ;    
  309.  
  310.     banx1 = x;
  311.     bany1 = y;
  312.     ishi_r = z;
  313.     ishi_2r = ishi_r * 2;
  314.     banx2 = banx1 + (bansize+1)*ishi_2r-1;
  315.     bany2 = bany1 + (bansize+1)*ishi_2r-1;
  316.  
  317.     EGB_color( gwork, 0, BLACK_PRINT_COL) ;
  318.     EGB_color( gwork, 2, BLACK_PRINT_COL) ;
  319.     for ( i = 0; i < bansize; i++){
  320.         EGB_singleLine( gwork, (i+1)*ishi_2r+banx1, bany1+ishi_2r, 
  321.                                (i+1)*ishi_2r+banx1, bany2-ishi_2r) ; 
  322.         EGB_singleLine( gwork, banx1+ishi_2r, bany1+(i+1)*ishi_2r,
  323.                                banx2-ishi_2r, bany1+(i+1)*ishi_2r) ; 
  324.     }
  325.     
  326.     if( type==NORMAL && bansize == 19){
  327.         for ( i = 0; i < 3; i++){
  328.             for ( j = 0; j < 3; j++){
  329.                 WORD(para + 0) = 6*ishi_2r*i+banx1+4*ishi_2r;
  330.                 WORD(para + 2) = 6*ishi_2r*j+bany1+4*ishi_2r;
  331.                 WORD(para + 4) = 2;
  332.                 EGB_circle( gwork, para ) ;  /* その位置に点を描く */
  333.             }
  334.         }
  335.     }
  336.  
  337.     return 0;
  338. }
  339.  
  340. static int print_do_te(char ban[],int ex_ban[])
  341. {
  342. char s[4];
  343. int stonex, stoney;
  344. int ichi;
  345.  
  346.     for(stoney=1;stoney<(bansize+1);stoney++){
  347.         for(stonex=1;stonex<(bansize+1);stonex++){
  348.             ichi = henkan_disp_out( stonex, stoney);
  349.             switch(ban[ichi]){
  350.             case BLACK:
  351.                 EGB_color( gwork, 0, BLACK_PRINT_COL); 
  352.                 EGB_color( gwork, 2, BLACK_PRINT_COL);
  353.                 print_gcircle((stonex)*ishi_2r+banx1, (stoney)*ishi_2r+bany1, 
  354.                         ishi_r);
  355.                 break; 
  356.             case WHITE:
  357.                 EGB_color( gwork, 0, BLACK_PRINT_COL) ; 
  358.                 EGB_color( gwork, 2, WHITE_PRINT_COL);
  359.                 print_gcircle((stonex)*ishi_2r+banx1, (stoney)*ishi_2r+bany1, 
  360.                         ishi_r);
  361.                 break; 
  362.             case BLANK:
  363.                 break;
  364.             }
  365.             
  366.             switch(ban[ichi]){
  367.                 case BLANK:
  368.                     break;
  369.                 case BLACK:
  370.                     EGB_color( gwork, 0, WHITE_PRINT_COL) ; 
  371.                     EGB_color( gwork, 2, WHITE_PRINT_COL) ; 
  372.                     break;
  373.                 case WHITE:
  374.                     EGB_color( gwork, 0, BLACK_PRINT_COL) ; 
  375.                     EGB_color( gwork, 2, BLACK_PRINT_COL) ; 
  376.                     break;
  377.             }
  378.             if(ban[ichi] != BLANK){
  379.                     if(ex_ban[ichi] >= 100){
  380.                         s[0] = '0' + ex_ban[ichi]/100;
  381.                         s[1] = '0' + (ex_ban[ichi]%100)/10;
  382.                         s[2] = '0' + (ex_ban[ichi]%10);
  383.                         s[3] = '\0';
  384.                            print_gprint(s, (stonex)*ishi_2r+banx1-12,
  385.                                      (stoney)*ishi_2r+bany1+8);
  386.                     }else if(ex_ban[ichi] >= 10){
  387.                         s[0] = '0' + ex_ban[ichi]/10;
  388.                         s[1] = '0' + (ex_ban[ichi]%10);
  389.                         s[2] = '\0';
  390.                            print_gprint(s, (stonex)*ishi_2r+banx1-8,
  391.                                      (stoney)*ishi_2r+bany1+8);
  392.                     }else if(ex_ban[ichi] >= 1){
  393.                         s[0] = '0' + (ex_ban[ichi]%10);
  394.                         s[1] = '\0';
  395.                            print_gprint(s, (stonex)*ishi_2r+banx1-4,
  396.                                      (stoney)*ishi_2r+bany1+8);
  397.                     }
  398.                 
  399.             }
  400.         }
  401.     }
  402.  
  403.     
  404.     return 0;
  405. }
  406.  
  407. int print_exec()
  408. {
  409.  
  410. char        g_buf[640*40/8];
  411. int            i, ystep;
  412. int         rc;
  413.  
  414.     EGB_writePage( gwork, 0x80 ) ;    /* 仮想画面に設定 */
  415.  
  416.     ystep = 40;
  417.     for(i=0;i<ban_length+tate_bangai;i+=ystep){
  418.         DWORD(para) = (int)g_buf;
  419.         WORD(para+4) = getds();
  420.         WORD(para+6) = left_mergin;
  421.         WORD(para+8) = i;
  422.         WORD(para+10) = ban_length+left_mergin-1;
  423.         WORD(para+12) = i+ystep-1;
  424.         EGB_getBlock(gwork, para);
  425.  
  426.         rc = BPR_Print( ystep, g_buf);
  427.         if( rc < 0 ){
  428.             printf("--BPR_Print ERROR!! %x--\n",BPRDEVERR);
  429.             my_free(ram);
  430.             if( work.Work1.BuffSize != 0 )
  431.                 my_free(work.Work1.BuffAddr);
  432.             my_free(work.Work2.BuffAddr);
  433.             my_free(work.Work3.BuffAddr);
  434.             my_free(work.Work4.BuffAddr);
  435.             my_free(work.Work5.BuffAddr);
  436.             EGB_writePage( gwork, 0) ;    /* ページ 0     に */
  437.             return    -1;
  438.         }
  439.     }
  440.     
  441.     my_free(ram);
  442.     if( work.Work1.BuffSize != 0 )
  443.         my_free(work.Work1.BuffAddr);
  444.     my_free(work.Work2.BuffAddr);
  445.     my_free(work.Work3.BuffAddr);
  446.     my_free(work.Work4.BuffAddr);
  447.     my_free(work.Work5.BuffAddr);
  448.  
  449.     EGB_writePage( gwork, 0) ;    /* ページ 0     に */
  450.  
  451.     return 0;
  452.  
  453. }
  454.  
  455. /* p 文字列 x 初期座標 y 初期座標 */
  456. static int print_gprint( char *p, int x, int y)
  457. {
  458. int i;
  459. char dsp[80];
  460.  
  461.     WORD(dsp+0) = x;
  462.     WORD(dsp+2) = y;
  463.     for(i=0;i<80;i++){
  464.         dsp[i+6] = (char)(BYTE(p+i));
  465.         if(dsp[i+6] == (char)0 ){
  466.             break;
  467.         }
  468.     }
  469.     WORD(dsp+4) = i;
  470.     EGB_writeMode(gwork, 0);
  471.     EGB_sjisString(gwork, dsp);
  472.     return i;
  473.     
  474. }
  475.  
  476. static int print_gcircle(int x, int y, int r)
  477. {
  478.  
  479.     WORD(para + 0) = x;
  480.     WORD(para + 2) = y;
  481.     WORD(para + 4) = r;
  482.     EGB_circle( gwork, para ) ;/* その位置に点を描く */
  483.  
  484.     return 0;
  485.     
  486. }
  487.